/**
 * Author: Wang Haitao
 * Date: 2024-xx-xx
 * Description: 这个文件关于INA22x的报警IO，目前使用查询的方式，对响应速度有要求可以增加外部中断的方式
 * Code Copy：拷贝代码，请加上作者信息。
 */
#include "ina22x_alert_io.h"

static volatile unsigned int* WHT_Alert_Status[Alert_COUNT];

static void WHT_INA22x_Alert_GPIO_Init(void)
{
    WHT_GPIO_BSP.WHT_Set_Clock(Alert0_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert1_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert2_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert3_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert4_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert5_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert6_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert7_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert8_Port, ENABLE);    
    WHT_GPIO_BSP.WHT_Set_Clock(Alert9_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert10_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert11_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert12_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert13_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert14_Port, ENABLE);
    WHT_GPIO_BSP.WHT_Set_Clock(Alert15_Port, ENABLE);
    
    WHT_GPIO_BSP.WHT_Set_Pin(Alert0_Port, Alert0_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert1_Port, Alert1_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert2_Port, Alert2_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert3_Port, Alert3_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert4_Port, Alert4_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert5_Port, Alert5_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert6_Port, Alert6_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert7_Port, Alert7_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert8_Port, Alert8_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert9_Port, Alert9_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert10_Port, Alert10_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert11_Port, Alert11_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert12_Port, Alert12_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert13_Port, Alert13_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert14_Port, Alert14_Pin, Hig);
    WHT_GPIO_BSP.WHT_Set_Pin(Alert15_Port, Alert15_Pin, Hig);

    WHT_GPIO_BSP.WHT_Set_Mode(Alert0_Port, Alert0_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert1_Port, Alert1_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert2_Port, Alert2_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert3_Port, Alert3_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert4_Port, Alert4_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert5_Port, Alert5_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert6_Port, Alert6_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert7_Port, Alert7_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert8_Port, Alert8_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert9_Port, Alert9_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert10_Port, Alert10_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert11_Port, Alert11_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert12_Port, Alert12_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert13_Port, Alert13_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert14_Port, Alert14_Pin, Mode_IPU);
    WHT_GPIO_BSP.WHT_Set_Mode(Alert15_Port, Alert15_Pin, Mode_IPU);

    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert0_Port, Alert0_Pin, &WHT_Alert_Status[0]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert1_Port, Alert1_Pin, &WHT_Alert_Status[1]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert2_Port, Alert2_Pin, &WHT_Alert_Status[2]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert3_Port, Alert3_Pin, &WHT_Alert_Status[3]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert4_Port, Alert4_Pin, &WHT_Alert_Status[4]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert5_Port, Alert5_Pin, &WHT_Alert_Status[5]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert6_Port, Alert6_Pin, &WHT_Alert_Status[6]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert7_Port, Alert7_Pin, &WHT_Alert_Status[7]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert8_Port, Alert8_Pin, &WHT_Alert_Status[8]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert9_Port, Alert9_Pin, &WHT_Alert_Status[9]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert10_Port, Alert10_Pin, &WHT_Alert_Status[10]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert11_Port, Alert11_Pin, &WHT_Alert_Status[11]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert12_Port, Alert12_Pin, &WHT_Alert_Status[12]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert13_Port, Alert13_Pin, &WHT_Alert_Status[13]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert14_Port, Alert14_Pin, &WHT_Alert_Status[14]);
    WHT_GPIO_BSP.WHT_Register_Bit_Input(Alert15_Port, Alert15_Pin, &WHT_Alert_Status[15]);
}
static WHT_INA22x_Alert_enum WHT_INA22x_Get_Alert_Status(uint8_t number)
{
    return number < Alert_COUNT ? (WHT_INA22x_Alert_enum)*WHT_Alert_Status[number] : Alert_Close;
}
static uint16_t INA22x_Get_Alert_All_Status(void)
{
    uint16_t result = 0;

    for (uint8_t i = 0; i < Alert_COUNT; i++)
        result |= *WHT_Alert_Status[i] << i;
    return result;
}


const WHT_INA22x_Alert_Status_t WHT_INA22x_Alert_Status = 
{
    .WHT_Init                 = WHT_INA22x_Alert_GPIO_Init,
    .WHT_Get_Alert_Status     = WHT_INA22x_Get_Alert_Status,
    .WHT_Get_All_Alert_Status = INA22x_Get_Alert_All_Status,
};
